use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // 1
    // for i in 0..10 {
    //     println!("{i}");
    //     thread::sleep(Duration::from_secs(1))
    // }

    // 2
    // let handle = thread::spawn(|| {
    //     for i in 0..10 {
    //         println!("{i}");
    //         thread::sleep(Duration::from_millis(1));
    //     }
    // });
    //
    // //线程处添加join ， 程序需要等待join的线程结束才会向下执行
    // handle.join().unwrap();
    //
    // for i in 0..10 {
    //     println!("main线程 输出{i}");
    //     thread::sleep(Duration::from_millis(1))
    // }
    //2 end

    //3
    // let v = vec![1, 2, 3];
    //
    // let handler = thread::spawn(move || {
    //     println!("here's a vector :{:?} ", v)
    // });
    // handler.join().unwrap();


    // let (tx, rx) = mpsc::channel();
    //
    // let tx1 = tx.clone();
    //
    // thread::spawn(move || {
    //     let v = vec!["1", "2", "3", "4"];
    //
    //     for x in v {
    //         tx.send(x);
    //         thread::sleep(Duration::from_secs(2));
    //     }
    // });
    //
    // thread::spawn(move || {
    //     let v = vec!["5", "6", "7", "8"];
    //
    //     for x in v {
    //         tx1.send(x);
    //         thread::sleep(Duration::from_secs(2));
    //     }
    // });
    //
    //
    // for x in rx {
    //     println!("Got: {}", x);
    // }

    let counter = Arc::new(Mutex::new(0));

    let mut handlers = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&counter);

        let handle = thread::spawn(move || {
            let mut c = counter.lock().unwrap();
            *c += 1;
        });
        handlers.push(handle);
    }

    for x in handlers {
        x.join().unwrap();
    }
    println!("result:{}", *counter.lock().unwrap())
}
